
package com.tencent.weibo.log
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	
	import mx.logging.ILogger;

	/**
	 * 区分消息类别的日志记录(简化实现版)
	 * @langversion 3.0
	 * @playerversion Flash 9
	 * @playerversion AIR 1.1
	 */	
	public class LevelLogger extends EventDispatcher implements ILogger
	{
		/**
		 * 是否将日志输出
		 * @default true
		 */		
		public static var outputEnabled:Boolean = true;
		
		/**@private*/
		private var _category:String;
		
		/**
		 * 获取一个Logger实例
		 * TODO:目前category接收是字符串，不利于重构，需要后期优化
		 * @param cat 类别
		 * @return Logger实例
		 */		
		public static function getLogger(cat:String):LevelLogger
		{
			return new LevelLogger(cat);
		}
		
		/**
		 * 构造方法
		 */	
		public function LevelLogger(cat:String)
		{
			_category = cat;
		}
		/**类别*/
		public function get category():String
		{
			return _category;
		}
		/**@private*/
		public function log(level:int, message:String, ...rest):void
		{
			throw new Error("Please use debug,error,fatal,info, or warn");
		}
		/**
		 * 记录Debug级别的信息
		 * @param message 消息
		 * @param rest 附加参数
		 * 
		 */		
		public function debug(message:String, ...rest):void
		{
			printMessage("DEBUG",message,rest);
		}
		/**
		 * 记录Error级别的信息
		 * @param message 消息
		 * @param rest 附加参数
		 * 
		 */		
		public function error(message:String, ...rest):void
		{
			printMessage("ERROR",message,rest);
		}
		/**
		 * 记录Fatal级别的信息
		 * @param message 消息
		 * @param rest 附加参数
		 * 
		 */		
		public function fatal(message:String, ...rest):void
		{
			printMessage("FATAL",message,rest);
		}
		/**
		 * 记录Info级别的信息
		 * @param message 消息
		 * @param rest 附加参数
		 * 
		 */		
		public function info(message:String, ...rest):void
		{
			printMessage("INFO",message,rest);
		}
		/**
		 * 记录警告级别的信息
		 * @param message 消息
		 * @param rest 附加参数
		 * 
		 */		
		public function warn(message:String, ...rest):void
		{
			printMessage("WARNNING",message,rest);
		}
		
		/**@private*/
		private function printMessage(level:String,message:String,rest:Array):void
		{
			// replace all of the parameters in the msg string
			for (var i:int = 0; i < rest.length; i++)
			{
				message = message.replace(new RegExp("\\{"+i+"\\}", "g"), rest[i]);
			}
			if(outputEnabled)
			{
				//TODO:目前只实现从trace输出，应该允许接入其它的日志记录工具
				trace("["+level+"]["+category+"]: "+message);
			}
		}
	}
}